Understanding GraphQL schema stitching(part I)
目的是使用已经有的 graphql API,通过我们自己的服务器暴露出来. 在配置阶段,我们只是简单的转发收到的GraphQL query 和 mutations.负责转发这些操作的组件被称为 remote(executable)schema
.
Remote shcema 作为 schema stitching schema的基础工具. 下面讨论一下细节问题.
回忆一下 GraphQL schemas
schema由两个主要组件构成(这里的组件不是 react组件)
schema definition
: 这部分通常用 schema definition language(SDL).本质上, schema 定义了 server能够接受的操作是什么, 需要报含Query
type,可选的Mutations
,Subscription
. 可以用typeDefs
定义Resolvers
: 这里是 shcema 真正进入到实际操作的地方, Resolvers实现了有由 schema 定义的 API 规范.
当一个 schema 有了 definition和 resolver,被称为executable schema.
下面是简单的实例,使用graphql-tools
的makeEcecutableSchema
函数:
1 | const { makeExecutableSchema } = require('graphql-tools') |
typeDefs
包含了 schema 定义, 由Query
和简单的User
type组成. resolvers
是包含了如何实现Query
type 中user
字段实现的方案
makeEcecutableSchema
: 从 SDL type 映射到对应的 resolver. 返回的实例可以用于直接的查询. 例如graphql
函数
1 | ... // other imports |
因为 grphql 函数可以根据 GraphQLSchema的实例来查询,所以也可以被认为是 GraphQL(execute) 引擎
以上只是回顾. 现在看看如何根据已经存在的 graphql API 创建GraphQLSchema
的可执行实例
Introspecting GraphQL APIS
GraphQL的有一个很趁手的属性, introspection
. 可以发起一个 introspection query 来获取schema的定义.
1 | query { |
返回的是 json 格式的数据
1 | { |
返回的 schema和我们自己定义的 shcema 很像, 稍有差别,但是可以修改
创建一个 remote schema
makeRemoteExecutableSchema
接收两个参数
- 一个 shcema 定义(这里通过 introspection 获取). 最佳实践是直接定义为
.grpahql
文件 - Link连接被代理的 GraphQL API. 本质上, Link 是转发 query 和 mutation 的组件.
没有办法获取到 remote的 resolver.但是可以创建新的 resolver,来转发操作到内部的 GraphQL API.
看看实际的代码, 基于一个 API,用于User
模型.
1 | const fetch = require('node-fetch') |
用于User
type 的 CRUD API
1 | type User @model { |
底层的 Remote schemas
Inspecting GraphQL schemas
篮框显示Query
type和他的属性. 有字段allUsers
,但是 没有 resolver,所以这不是可执行的.
现在有 resolver
了.
继续看看 resolver
的实现,(这是由 makeRemoteExecuteableSchema 自动生成的).
1 | function (root, args, context, info) { |
12-16行代码 函数fetcher
用三个参数调用,query
,variables
,context
,